<?php
/**
 * Created by PhpStorm.
 * User: HuangLuSen
 * Date: 2017/12/8
 * Time: 15:37
 */

namespace app\queue\jobs;

use app\admin\model\Wesmslog;
use think\queue\Job;

/**
 * Class Wechat 队列消费类
 * @package app\job\controller
 * @author: Huang
 */
class Wechat
{
    use \app\wechat\traits\Wechat;
    /**
     * fire方法是消息队列默认调用的方法
     * @param Job $job 当前的任务对象
     * @param array|mixed $data 发布任务时自定义的数据
     */
    public function fire(Job $job, $data)
    {
        // 如有必要,可以根据业务需求和数据库中的最新数据,判断该任务是否仍有必要执行.
//        $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
//        if (!$isJobStillNeedToBeDone) {
//            $job->delete();
//            return;
//        }
        $isJobDone = $this->doJob($data);

        if ($isJobDone) {
            //如果任务执行成功， 记得删除任务
            $job->delete();
//            print("<info>任务已经被删除" . "</info>\n");
        } else {
            if ($job->attempts() > 3) {
                //通过这个方法可以检查这个任务已经重试了几次了
//                print("<warn>任务已经处理了3次了" . "</warn>\n");
                $job->delete();
            }
        }
    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array|mixed $data 发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    private function checkDatabaseToSeeIfJobNeedToBeDone($data)
    {
        return true;
    }

    /**
     * 根据消息中的数据进行实际的业务处理
     * @param array|mixed $data 发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    public static function doJob($data)
    {
        // 根据消息中的数据进行实际的业务处理...
        $datas = $data;
        unset($data['send_id']);
        unset($data['order_id']);
        try {
            $arr = self::getInstance()->notice->send($data);
            $arr = json_decode($arr, true);
        } catch (\Exception $exception) {
            $arr['is_success'] = 2;
            $arr['error_msg'] = '用户id为【' . $data['receive_id'] . '】的微信推送失败！错误信息是:' . $exception->getMessage() . '，错误代码是:' . $exception->getCode();;
        }
        return self::Log($datas, $arr);
    }

    /**
     * 微信发送日志
     * @param $data
     * @param $array
     * @return bool
     * @author: Huang
     */
    public static function Log($data, $array)
    {
        $re = $array;
        $wesmslog = new Wesmslog();
        $str = '';
        foreach ($data as $key => $v) {
            if (is_array($v)) {
                foreach ($v as $keys => $vo) {
                    $str .= $keys . ":" . $vo['value'] . ';';
                }
            } else {
                $str .= $key . ":" . $v . ';';
            }
        }
        $array['send_id'] = $data['send_id'];
        $array['receive_id'] = $data['receive_id'];
        $array['order_id'] = $data['order_id'];
        $array['send_msg'] = $str;
        $wesmslog->allowField(true)->save($array);
        return $re;
    }
}